package presentation;

import java.io.IOException;
import java.sql.Date;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import services.*;
import dao.*;
import model.*;

/**
 * Servlet implementation class ObtenerReportesComisionesPremios
 */
@WebServlet("/ObtenerReportesComisionesPremios")
public class ObtenerReportesComisionesPremios extends HttpServlet {

	private static final long serialVersionUID = 1L;
	public ComisionDAO comisionesService = null;
	public PremioDAO premiosService = null;
	public EmpleadoDAO empleadosService = null;
	public VentaDAO ventasService = null;
	public ProductoDAO productosService = null;
	public VentaXProductosDAO ventaXProductosService = null;

	@Override
	public void init(ServletConfig config) {
		WebApplicationContext context = WebApplicationContextUtils
				.getRequiredWebApplicationContext(config.getServletContext());
		this.comisionesService = (ComisionDAO) context.getBean(ComisionDAO.class);
		this.premiosService = (PremioDAO) context.getBean(PremioDAO.class);
		this.empleadosService = (EmpleadoDAO) context.getBean(EmpleadoDAO.class);
		this.ventasService = (VentaDAO) context.getBean(VentaDAO.class);
		this.productosService = (ProductoDAO) context.getBean(ProductoDAO.class);
		this.ventaXProductosService = (VentaXProductosDAO) context
				.getBean(VentaXProductosDAO.class);

	}
	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public ObtenerReportesComisionesPremios() {
		super();

	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		List<Comision> comisiones = this.comisionesService.getAll();
		request.getSession().setAttribute("Comisiones", comisiones);
		List<Premio> premios = this.premiosService.getAll();
		request.getSession().setAttribute("Premios", premios);
		List<Empleado> empleados = this.empleadosService.getVendedores();
		request.getSession().setAttribute("Vendedores", empleados);

		List<Producto> productos = this.productosService.getAll();
		request.getSession().setAttribute("Productos", productos);

		request.getSession().setAttribute("MensajeReportes", null);
		response.sendRedirect("ObtenerReportesComisionesPremios.jsp");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String mensaje = null;

		List<Venta> ventas = this.ventasService.getAll();
		List<Empleado> empleados = this.empleadosService.getVendedores();
		List<Comision> comisiones = this.comisionesService.getAll();
		List<Producto> productos = this.productosService.getAll();
		List<Premio> premios = this.premiosService.getAll();
		List<VentaXProductos> ventasXcantidades = this.ventaXProductosService.getAll();

		boolean valido = true;

		if (request.getParameter("btnComisionPorVentas") != null) {
			try {
				Date fecha_inicio = java.sql.Date.valueOf(request.getParameter("fechainicio"));
				Date fecha_fin = java.sql.Date.valueOf(request.getParameter("fechafin"));

				if (!ReportesServicio.validarFecha(fecha_inicio, fecha_fin)) {
					mensaje = "Fechas invalidas.";
					valido = false;
				}

				List<Resultados> res = new ArrayList<Resultados>();

				// Comision por Ventas
				for (Empleado empleado : empleados) {
					Integer cantidad_ventas = ReportesServicio.calcularCantidadVentasVendedor(
							empleado.getDni(), ventas, fecha_inicio, fecha_fin);
					Integer comision_ventas = ReportesServicio
							.calcularMontoComisionPorVentas(cantidad_ventas, comisiones);
					res.add(new Resultados(empleado.getDni(),
							empleado.getApellido() + ", " + empleado.getNombre(), comision_ventas,
							0, 0));
				}

				// Comision por Productos
				res = ReportesServicio.comisionPorProductosResultado(res, ventas, productos,
						ventasXcantidades);

				// Premio por mejor vendedor del mes
				Integer adicional_premio_mes = 0, adicional_premio_producto = 0;
				for (Premio premio : premios) {
					if (premio.getCategoria().equals("Mejor vendedor del mes"))
						adicional_premio_mes = premio.getValor();
					if (premio.getCategoria().equals("Producto en particular"))
						adicional_premio_producto = premio.getValor();
				}

				Empleado mejor_mes_empleado = ReportesServicio
						.calcularPremioMejorVendedorMes(ventas, empleados, fecha_inicio);

				res = ReportesServicio.premioMejorVendedorResultado(res, mejor_mes_empleado,
						adicional_premio_mes);

				// Premios por producto
				res = ReportesServicio.premioPorProductoResultado(productos,
						adicional_premio_producto, res, ventas, empleados, ventasXcantidades,
						fecha_inicio);

				// Sumar Total
				for (int j = 0; j < res.size(); j++) {
					Resultados res_temp3 = res.get(j);
					res_temp3.setTotal(res_temp3.getComision() + res_temp3.getPremio());
					res.set(j, res_temp3);
				}

				if (valido) {
					request.getSession().setAttribute("Resultados", res);

				} else {
					request.getSession().setAttribute("Resultados", null);
				}

			} catch (Exception e) {
				System.out.println(e.getMessage());
				valido = false;
			}
		}

		request.getSession().setAttribute("MensajeReportes", mensaje);

		response.sendRedirect("ObtenerReportesComisionesPremios.jsp");
	}

}
